/*************************************************
Author: will
Date: 9/5/2012
Description:
Notes: 
*************************************************/

#ifndef __CBattleVideo_h__
#define __CBattleVideo_h__

#include "commclass.h"

enum ENUM_VIDEO_SKILL_STAT
{
    //从右(低位)到左(高位)
    BATTLE_VIDEO_SKILL_HIT          = (0x1 << 0),        //命中 第1位表示命中
    BATTLE_VIDEO_SKILL_BLOCK        = (0x1 << 1),        //格挡 第2位表示格挡
    BATTLE_VIDEO_SKILL_DOUBLE       = (0x1 << 2),        //暴击 第3位表示暴击
    BATTLE_VIDEO_SKILL_CRIT         = (0x1 << 3),        //必杀 第4位表示必杀
    BATTLE_VIDEO_DEAD_KILL          = (0x1 << 4),        //斩杀 第5位表示斩杀
};

enum ENUM_VIDEO_EXE_SKILL_STAT
{
    //策划要求:技能只分单体和群攻 非单一目标就认为是群攻
    VIDEO_EXE_SKILL_SCOPE_MAIN = 1,         //范围内单体
    VIDEO_EXE_SKILL_SCOPE_GROUP = 2,        //范围内群攻
    VIDEO_EXE_SKILL_DISTAN_MAIN = 11,       //距离上单体
    VIDEO_EXE_SKILL_DISTAN_GROUP = 12,      //距离上群攻
};

enum ENUM_VIDEO_COURAGE_STAT
{
    BATTLE_VIDEO_COURAGE_DEL = 0,           //标识清除
    BATTLE_VIDEO_COURAGE_ADD = 1,           //标识置上
};

enum ENUM_VIDEO_ANGER_STAT
{
    BATTLE_VIDEO_ANGER_DEL = 0,           //标识清除
    BATTLE_VIDEO_ANGER_ADD = 1,           //标识置上
};

enum BATTLE_VIDEO_ACTION_ID
{
    BATTLE_VIDEO_CTRL_BATTLE_START          = 1, //战斗开始         格式：无参数
    BATTLE_VIDEO_CTRL_BATTLE_END            = 2, //战斗结束         格式：无参数
    BATTLE_VIDEO_CTRL_CIRCLE_START          = 3, //一圈开始         格式：圈数
    BATTLE_VIDEO_CTRL_CIRCLE_END            = 4, //一圈结束         格式：圈数
    BATTLE_VIDEO_CTRL_ROLE_START            = 5, //角色行动开始     格式：角色ID
    BATTLE_VIDEO_CTRL_ROLE_END              = 6, //角色行动结束     格式：角色ID
    
    //以下是前端在用
    BATTLE_VIDEO_TEAM_ID                    = 7,  //队伍ID
    BATTLE_VIdEO_TEAM_POS                   = 8,  //队伍站位
    BATTLE_VIDEO_ROLE_INFO                  = 9,  //角色信息
    BATTLE_VIDEO_ROLES_INFO                 = 10, //
    BATTLE_VIDEO_MAP_INFO                   = 11, //地图信息
    BATTLE_VIDEO_ROLE_SHOW                  = 12, //控制角色的形象串
    BATTLE_VIDEO_ROLE_PET                   = 13, //角色宠物
    BATTLE_VIDEO_ROLE_MOUNT                 = 14, //角色坐骑

    //此指令过后至功能关闭间的所有指令将组合在一起作为一条单独指令存在
    BATTLE_VIDEO_GROUP_CMD_START            = 301,//组合命令功能开启 
    BATTLE_VIDEO_GROUP_CMD_STOP             = 302,//组合命令功能关闭
    BATTLE_VIDEO_ROLE_WAIT                  = 303,//等待特定时间 格式: 角色ID,等待时间(毫秒为单位,默认500)

    BATTLE_VIDEO_CONT_HP_CHG                = 101, //血量变化    格式：角色ID,血量变化(可正可负)
    BATTLE_VIDEO_CONT_COURAGE_CHG           = 103, //勇气变化    格式：角色ID,勇气变化(可正可负)
    BATTLE_VIDEO_CONT_ANGER_CHG             = 104, //怒气变化    格式：角色ID,怒气变化(可正可负)
    BATTLE_VIDEO_CONT_EFT_MISS              = 105, //Buff消失    格式：角色ID,来源角色ID,BuffID
    BATTLE_VIDEO_CONT_EXE_SKILL             = 106, //施放技能
    //格式:角色ID,技能ID,技能类型(ENUM_VIDEO_EXE_SKILL_STAT),群体目标起点,群体目标终点,目标ID1,目标ID2,...

    BATTLE_VIDEO_CONT_SKILL_COST            = 107, //技能消耗    格式：角色ID,技能ID,消耗的怒气,消耗的生命
    BATTLE_VIDEO_CONT_MOVE                  = 108, //角色移动    格式：角色ID,移动后所在的格子
    BATTLE_VIDEO_CONT_ADD_EFT               = 109, //添加Buff    格式：角色ID,来源角色ID,BuffID,剩余回合数,叠加层数
    BATTLE_VIDEO_CONT_SHIELD_CHG            = 110, //护盾变化    格式：角色ID,护盾变化(可正可负)
    BATTLE_VIDEO_CONT_ATK_DOT               = 111, //角色受击
    //格式:角色ID,受击结果(ENUM_VIDEO_SKILL_STAT),血量变化(可正可负),击退到格子(-1表示未击退),拖拽到格子(-1表示未拖拽)

    BATTLE_VIDEO_CONT_NO_COURAGE            = 112, //没有勇气，回合结束         格式：角色ID
    BATTLE_VIDEO_CONT_SWIM                  = 113, //角色眩晕，回合结束         格式：角色ID
    BATTLE_VIDEO_CONT_STOP                  = 114, //技能失效，回合结束         格式：角色ID
    BATTLE_VIDEO_CONT_DEAD                  = 115, //角色死亡                   格式：角色ID

    BATTLE_VIDEO_CONT_COURAGE_RECV          = 116, //勇气正在恢复标识
    //格式：角色ID,标识状态(ENUM_VIDEO_COURAGE_STAT 0:清除 1:置上)

    BATTLE_VIDEO_CONT_ANGER_FULL            = 117, //怒气已恢复满标识
    //格式：角色ID,标识状态(ENUM_VIDEO_ANGER_STAT 0:清除 1:置上)

    BATTLE_VIDEO_CONT_FALL_BACK             = 118, //勇气变零个体撤退   //格式：角色ID
    BATTLE_VIDEO_CONT_TREASURE              = 119, //秘宝生效           //格式：角色ID 秘宝ID 基准值 等级变化值
    BATTLE_VIDEO_CONT_MOUNT                 = 120, //坐骑生效           //格式：角色ID 坐骑ID 基准值 等级变化值
};

class CBattleVideo;
class CBattleVideoAction
{
friend class CBattleVideo;
private:
    CTLib::CTArray<int, MAX_VIDEO_FRAME_COUNT> astFrame;   
};

class MsgBattleResult;
class CBattleSkillCastEffect;
class CBattleVideo
{
public:
    CBattleVideo() 
    {
    }

    void Init()
    {
        _bCircleBegin = true;
        _bLeftTurn = false;
        _astAct.Clear();
    }
    void WriteVideo(MsgBattleResult& stMsgBattleRes);
    void BattleBegin();
    void BattleEnd();
    void CircleBegin(int iRoundNum);
    void CircleEnd(int iRoundNum);
    void TurnBegin(int iRoleID);
    void TurnEnd(int iRoleID);
    void GroupCmdStart();
    void GroupCmdStop();
    void ModPlayerHP(int iRoleID, int iBloodChg);
    void BuffExpire(int iRoleID, int iSrcID, int iBuffID, int iIndex);
    void CastSkill(int iRoleID, int iSkillID, int iTargetType,
            CBattleSkillCastEffect& stFirstEffect,
            CBattleSkillCastEffect& stSecondEffect);
    void CastSkillConsume(int iRoleID, int iSkillID, int iUseAnger, int iUseHP);
    void Move(int iRoleID, int iToGrid);
    void AddBuff(int iRoleID, int iSrcID, int iBuffID, int iTurn, int iAddNum);
    void ModCourage(int iRoleID, int iValue);
    void ModAnger(int iRoleID, int iValue);
    void ModShield(int iRoleID, int iValue);
    void LostBloodBySkill(int iRoleID, int iStat, int iBlood, int iHitBack, int iPull);
    void NoCourageTurnEnd(int iRoleID);
    void IsSwimTurnEnd(int iRoleID);
    void CanNotUseSkill(int iRoleID);
    void RoleDead(int iRoleID);
    void RoleCourageStat(int iRoleID, int iStat);
    void RoleAngerStat(int iRoleID, int iStat);
    void RoleFallBack(int iRoleID);
    void RoleTreasureAct(int iRoleID, int iTreasureID, int iBaseVal, int iChgByLvl);
    void RoleWaitTime(int iRoleID, int iMsec);
    void RoleMountAct(int iRoleID, int iMountID, int iBaseVal, int iChgByLvl);

private:
    CBattleVideoAction& GetFrame()
    {
        int iIndex = (_astAct.Size() == _astAct.GetCount() ? _astAct.Size() - 1 : _astAct.Size());

        if (_astAct.GetCount() > _astAct.Size())
        {
            _astAct.m_iUsedCount++;
        }
        else
        {
            CT_ERROR(("video frame is full!"));
        }

        _astAct[iIndex].astFrame.Clear();
        return _astAct[iIndex];
    }

    bool GetCircleBegin() const {return _bCircleBegin;}
    void SetCircleBegin(bool bVal) {_bCircleBegin = bVal;}

    bool GetLeftTurn() const {return _bLeftTurn;}
    void SetLeftTurn(bool bVal) {_bLeftTurn = bVal;}

private:
    bool _bCircleBegin;
    bool _bLeftTurn;
    CTLib::CTArray<CBattleVideoAction, MAX_VIDEO_ACTION_COUNT> _astAct;  
};

#endif // __CBattleVideo_h__

